﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SouthApps.MobileHealth.SDK.DAL.DataAccess;
using SouthApps.MobileHealth.SDK.Common.Exceptions;
using SouthApps.MobileHealth.SDK.DAL.Model;
using SouthApps.MobileHealth.SDK.Common;

namespace SouthApps.MobileTasks.SDK.DAL.Repositories
{
    public class PrestadoresRepository : IPrestadoresRepository
    {
        PrestadorDao prestadorDao;
        SucursalPrestadorDao sucursalPrestadorDao;
        LocacionServicioEspecialDao locacionServicioEspecialDao;
        GuardiaSucursalPrestadorDao guardiaSucursalPrestadorDao;

        public PrestadoresRepository()
        {
            this.prestadorDao = new PrestadorDao();
            this.sucursalPrestadorDao = new SucursalPrestadorDao();
            this.locacionServicioEspecialDao = new LocacionServicioEspecialDao();
            this.guardiaSucursalPrestadorDao = new GuardiaSucursalPrestadorDao();
        }


        public void AddPrestador(Prestador prestador)
        {
            try
            {
                this.prestadorDao.AddPrestador(prestador);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while adding a prestador.", ex.Message);
            }
        }

        public void AddSucursalPrestador(int financiadorId, SucursalPrestador sucursalPrestador)
        {
            try
            {
                this.sucursalPrestadorDao.AddSucursalPrestador(financiadorId, sucursalPrestador);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while adding a sucursal prestador.", ex.Message);
            }
        }

        public List<Prestador> GetPrestadoresFinanciador(int financiadorId)
        {
            try
            {
                return this.prestadorDao.GetPrestadoresFinanciador(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting prestadores financiador.", ex.Message);
            }
        }

        public List<SucursalPrestador> GetSucursalesPrestadorFinanciador(int financiadorId)
        {
            try
            {
                return this.sucursalPrestadorDao.GetSucursalesPrestadorFinanciador(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting sucursales prestador financiador.", ex.Message);
            }
        }

        public List<LocacionServicioEspecial> GetLocacionesServicioEspecialFinanciador(int financiadorId, int servicioEspecialId)
        {
            try
            {
                return this.locacionServicioEspecialDao.GetLocacionesServicioEspecialFinanciador(financiadorId, servicioEspecialId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting locaciones servicio especial financiador.", ex.Message);
            }
        }

        public List<LocacionServicioEspecial> GetLocacionesServiciosEspecialesFinanciador(int financiadorId)
        {
            try
            {
                return this.locacionServicioEspecialDao.GetLocacionesServicioEspecialFinanciador(financiadorId, null);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting locaciones servicios especiales financiador.", ex.Message);
            }
        }

        public List<GuardiaSucursalPrestador> GetGuardiasSucursalesPrestador(int financiadorId)
        {
            try
            {
                return this.guardiaSucursalPrestadorDao.GetGuardiasSucursalesPrestador(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting guardias sucursales prestador financiador.", ex.Message);
            }
        }

        public void ModifyPrestador(Prestador prestador)
        {
            try
            {
                this.prestadorDao.ModifyPrestador(prestador);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while modifying a prestador.", ex.Message);
            }
        }


    }
}
